package com.dxf.chepter08

/**
 * 折叠:
 *  fold函数:
 *    将上一步返回的值作为函数的第一个参数继续传递参与运算,知道list中的所有元素被遍历
 *
 *    1 可以把reduceLeft 看做简化版的foldLeft
 *
 *    2 相关函数 fold foldLeft foldRight,参数reduce方法
 *
 *  折叠的理解和化简的理解几乎一样
 *
 *  foldLeft 和 foldRight 缩写方法 /: 和 :\
 *
 *
 *
 *
 */
object T97_集合折叠 {


  def main(args: Array[String]): Unit = {

    def minus2(n1: Int, n2: Int): Int = {
      n1 - n2
    }

    val list = List(1, 2, 3, 4)

    //折叠的理解和化简的理解几乎一样
    //(((5-1)-2)-3)-4
    //在左边先传入5,在执行函数 minus2
    println(list.foldLeft(5)(minus2 _)) //函数的柯里化 --> 把函数的多个参数分开来传递
    //等价于
    println((5 /: list) (minus2 _))

    // 1-(2-(3-(4-5)))
    println(list.foldRight(5)(minus2 _)) //函数的柯里化 --> 把函数的多个参数分开来传递
    println((list :\ 5) (minus2 _))


    //========================================

    println(test(1)("1")(1.01))

  }


  def test(a: Int)(b: String)(c: Double): String = {
    a + b + c
  }
}

